package com.getwandup.rxsensor;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import com.getwandup.rxsensor.domain.RxSensorEvent;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
/**
* RxSensor
*
* @author manolovn
*/
public class RxSensor {
private final SensorManager sensorManager;
private boolean isUnsubscribed;
public RxSensor(Context context) {
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
}
public Observable<RxSensorEvent> observe(final int sensorType, final int samplingPeriodUs) {
return Observable.create(new Observable.OnSubscribe<RxSensorEvent>() {
@Override
public void call(final Subscriber<? super RxSensorEvent> subscriber) {
final Sensor sensor = sensorManager.getDefaultSensor(sensorType);
if (sensor == null) {
subscriber.onError(new SensorNotFoundException());
}
final SensorEventListener sensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
subscriber.onNext(RxSensorEvent.from(event));
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
sensorManager.registerListener(sensorEventListener, sensor, samplingPeriodUs);
isUnsubscribed = false;
subscriber.add(new Subscription() {
@Override
public void unsubscribe() {
sensorManager.unregisterListener(sensorEventListener);
isUnsubscribed = true;
}
@Override
public boolean isUnsubscribed() {
return isUnsubscribed;
}
});
}
});
}
}